home *** CD-ROM | disk | FTP | other *** search
/ Archive Magazine CD 1995 / Archive Magazine CD 1995.iso / discs / prog_disc / volume_5 / issue_06 / benchmarks / c_source / factest < prev    next >
Encoding:
Text File  |  1991-06-04  |  3.0 KB  |  153 lines

  1. /*
  2.  * Program to test speed of file access by gaining contents of
  3.  * specified files and dumping them to stdout
  4.  *
  5.  * (c) Martin Houston.
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <fcntl.h>
  10. #include <errno.h>
  11. #include <sys/types.h>
  12. #include <sys/stat.h>
  13. #include <sys/ndir.h>
  14. #include <sys/timeb.h>
  15.  
  16. extern int errno;
  17. extern char *sys_errlist[];
  18.  
  19. DIR *opendir();
  20. struct direct *readdir();
  21.  
  22. long time();
  23.  
  24. long nfiles = 0L;               /* number of files accessed */
  25. long bytecount = 0L;            /* total data xfered */
  26.  
  27. main(argc, argv)
  28. int argc;
  29. char **argv;
  30. {
  31.     int file;
  32.     long starttime, endtime;
  33.     float mbm;
  34.     struct timeb tb;
  35.  
  36.  
  37.     ftime(&tb);
  38.     starttime = (tb.time * 1000) + tb.millitm;
  39.  
  40.     for(file = 1; file < argc; doname(argv[file++]))
  41.         ;
  42.  
  43.     ftime(&tb);
  44.     endtime = (tb.time * 1000) + tb.millitm;
  45.     endtime -=  starttime;
  46.  
  47.     fprintf(stdout,"ft transfers %ld bytes from %ld files in %ld milli-secs\n",
  48.         bytecount, nfiles, endtime);
  49.  
  50.     /* 
  51.      * We have bytes transferred and milli seconds.
  52.      * We want a figure in MB/Min.
  53.      */
  54.     mbm = (float)((float)bytecount / (float)1024 / (float)1024) 
  55.         / (float)((float)endtime / (float)1000 / (float)60);
  56.     fprintf(stdout,"transfer rate = %f MB/MIN\n",mbm);
  57.     exit(0);
  58. }
  59.  
  60. doname(name)
  61. char *name;
  62. {
  63.     static struct stat sbuf;
  64.  
  65.     if(stat(name, &sbuf) < 0)
  66.     {
  67.         dobad(name); /* Can't get status */
  68.     }
  69.     else
  70.     if((sbuf.st_mode & S_IFMT) == S_IFDIR)
  71.     {
  72.         dodir(name); /* is a directory */
  73.     }
  74.     else
  75.     if((sbuf.st_mode & S_IFMT) == S_IFREG)
  76.     {
  77.         dofile(name, sbuf.st_size); /* is a file */
  78.     }
  79. }
  80.  
  81. dobad(name)
  82. char *name;
  83. {
  84.     fprintf(stdout,"Error \"%s\" from %s\n", sys_errlist[errno], name);
  85. }
  86.  
  87. dodir(name)
  88. char *name;
  89. {
  90.  
  91.     DIR *dirp;
  92.     struct direct *dp;
  93.  
  94.     if(chdir(name) < 0)
  95.     {
  96.         dobad("Directory Push Operation");
  97.     }
  98.     else
  99.     if((dirp = opendir(".")) != NULL)
  100.     {
  101.         for(dp = readdir(dirp); dp != NULL; dp = readdir(dirp))
  102.         {
  103. #ifdef DEBUG
  104.             fprintf(stdout, "Scanning directory entry %s\n", dp->d_name);
  105. #endif
  106.             if((dp->d_namlen > 2) || 
  107.                (strcmp(dp->d_name, ".") && strcmp(dp->d_name,"..")))
  108.             {
  109.                 /* Not . or .. */
  110.                 doname(dp->d_name);
  111.             }
  112.         }
  113.         closedir(dirp);
  114.     }
  115.     if(chdir("..") < 0)
  116.     {
  117.         dobad("Directory Pop Operation");
  118.     }
  119. }
  120.  
  121. dofile(name, bytes)
  122. char *name;
  123. long bytes;
  124. {
  125.     static char buf[30000];
  126.     int fd, xfer;
  127.  
  128.     /* take stats */
  129.     nfiles++;
  130.     bytecount += bytes;
  131.  
  132. #ifdef DEBUG
  133.     fprintf(stdout, "Xfer of %ld bytes from %s\n", bytes, name);
  134. #endif
  135.  
  136.     if((fd = open(name, O_RDONLY)) < 0)
  137.     {
  138.         dobad(name);
  139.     }
  140.     else
  141.     {
  142.         while(bytes > 0L)
  143.         {
  144.             /* read the file into the buffer */
  145.             xfer = (bytes > (long)sizeof(buf) ? sizeof(buf) : (int)bytes);
  146.             xfer = read(fd, buf, xfer);
  147.             bytes -= xfer;
  148.         }
  149.         close(fd);
  150.     }
  151. }
  152.  
  153.